package entity;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Transient;

@Entity
@Table(name="Voyage")
public class Voyage implements Produit {
	static final int ALLER = 0; 
	static final int RETOUR = 1; 
	private long id;
	private Lieu destination;
	List<Trajet> listeTrajet;
	Set<Hebergement> listeHebergement;
	Set<PrestationAnnexe> listePrestAnnexe;
	Set<Thematique> listeThematique;

	public Voyage() {
		super();
	}

	@Transient
	public String getDescription(){
		//TODO
		return null;
	}
	@Transient
	public double getPrix(){
		//TODO
		return 0;
	}
	@Transient
	public Date getDateDebut(){
		//TODO
		return null;
	}

	@Override
	public String toString() {
		String laListeHebergement="";
		if (listeHebergement!=null && listeHebergement.size()>0) {
			laListeHebergement = ",  \n\tLa Liste : \n";
			for (Hebergement h :listeHebergement) {
				laListeHebergement+="\t"+h.toString()+"\n";
			}
		}
		return "[" + destination + ", " + ( getAller()==null?"":(getRetour()==null?"ALLER":"ALLER-RETOUR") + ",  \n\t" 
				+ getAller() + (getRetour()==null?"":(", \n\t" + getRetour())) + ",  \n") + "\tListe Hébergement : "+
				(listeHebergement==null?"liste vide":listeHebergement.size()+" élément(s)") + laListeHebergement+"]";
	}
	public void setAller(Trajet trajet) {
		if (listeTrajet == null)
			listeTrajet = new ArrayList<Trajet>(2);
		listeTrajet.add(ALLER, trajet);
	}
	@Transient
	public Trajet getAller() {
		try {
			return listeTrajet.get(ALLER);
		} catch (Exception e) {
			return null;
		}
	}
	public void setRetour(Trajet trajet) {
		if (listeTrajet == null)
			listeTrajet = new ArrayList<Trajet>(2);
		listeTrajet.add(RETOUR, trajet);
	}
	@Transient
	public Trajet getRetour() {
		try {
			return listeTrajet.get(RETOUR);
		} catch (Exception e) {
			return null;
		}
	}

	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	@OneToOne()
	@JoinColumn(name = "destination")
	public Lieu getDestination() {
		return destination;
	}
	public void setDestination(Lieu destination) {
		this.destination = destination;
	}
	@ManyToMany(
			targetEntity=entity.Trajet.class,
			cascade={CascadeType.PERSIST, CascadeType.MERGE}
	)
	@JoinTable(
			name="Voyage_Trajet",
			joinColumns=@JoinColumn(name="idVoyage"),
			inverseJoinColumns={@JoinColumn(name="idTrajet")}
	)
	
	public List<Trajet> getListeTrajet() {
		return listeTrajet;
	}
	public void setListeTrajet(List<Trajet> listeTrajet) {
		this.listeTrajet = listeTrajet;
	}
	@ManyToMany(
			targetEntity=entity.Hebergement.class,
			cascade={CascadeType.PERSIST, CascadeType.MERGE}
	)
	@JoinTable(
			name="Voyage_Hebergement",
			joinColumns=@JoinColumn(name="idVoyage"),
			inverseJoinColumns={@JoinColumn(name="idHebergement")}
	)
	
	public Set<Hebergement> getListeHebergement() {
		return listeHebergement;
	}
	public void setListeHebergement(Set<Hebergement> listeHebergement) {
		this.listeHebergement = listeHebergement;
	}
	@Transient
	public Set<PrestationAnnexe> getListePrestAnnexe() {
		return listePrestAnnexe;
	}
	public void setListePrestAnnexe(Set<PrestationAnnexe> listePrestAnnexe) {
		this.listePrestAnnexe = listePrestAnnexe;
	}
	@Transient
	public Set<Thematique> getListeThematique() {
		return listeThematique;
	}
	public void setListeThematique(Set<Thematique> listeThematique) {
		this.listeThematique = listeThematique;
	}
}
